package com.cwt.common.validator;

import com.cwt.common.annotation.MobilePhone;
import com.cwt.common.utils.StringUtils;
import com.cwt.common.validator.util.ResetMessageUtil;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

/**
 * @author chenwt
 * @version V1.0
 * @description 【手机号参数格式校验器】
 * @since 2023年11月13日 15:30:55
 */
public class MobilePhoneValidator implements ConstraintValidator<MobilePhone, String> {

    // 手机号码详细描述
    private String description;

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (StringUtils.isEmpty(value)) {
            return false;
        }

        // 空格校验
        if (value.contains(" ")) {
            ResetMessageUtil.reset(context, String.format("%s, 格式错误：不能包含空格", description));
            return false;
        }

        // 格式校验
        if (!isNumericSequence(value)) {
            ResetMessageUtil.reset(context, String.format("%s, 格式错误：必须为数字序列", description));
            return false;
        }

        // 长度校验
        if (value.length() > 11) {
            ResetMessageUtil.reset(context, String.format("%s, 格式错误：长度应小于等于11位", description));
            return false;
        }
        return true;
    }

    @Override
    public void initialize(MobilePhone constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
        description = constraintAnnotation.description();
    }

    // 手机号正则表达式
    private static final Pattern PATTERN_NUMERIC_SEQUENCE = Pattern.compile("^\\\\d*$");

    /**
     * 校验字符串是否为数字序列
     */
    private boolean isNumericSequence(CharSequence input) {
        return PATTERN_NUMERIC_SEQUENCE.matcher(input).matches();
    }

}
